package com.tanhua.dubbo.api.impl;

import com.tanhua.domain.mongo.Comment;
import com.tanhua.domain.mongo.Publish;
import com.tanhua.domain.mongo.Video;
import com.tanhua.domain.vo.PageResult;
import com.tanhua.dubbo.api.CommentApi;
import org.apache.dubbo.config.annotation.Service;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

@Service(timeout = 10000000)
public class CommentApiImpl implements CommentApi {

    @Autowired
    private MongoTemplate mongoTemplate;


    @Override
    public long save(Comment comment) {
        //抽离点赞功能代码
        return setUpdate(comment, Publish.class);
    }

    @Override
    public long delete(Comment comment) {
        // 取消点赞功能
        return setDelete(comment, Publish.class);
    }

    @Override
    public PageResult queryCommentsList(Integer page, Integer pagesize, String movementId) {
        // 创建查询对象
        Query query = new Query(Criteria.where("publishId").is(new ObjectId(movementId))
                .and("commentType").is(2)
        );
        // 指定排序参数
        query.with(Sort.by(Sort.Direction.DESC, "created"));
        // 指定分页参数
        query.limit(pagesize).skip((page - 1) * pagesize);

        // 获取当前页的数据
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        // 获取总条数
        long count = mongoTemplate.count(query, Comment.class);

        return new PageResult(page, pagesize, (int) count, commentList);
    }

    /**
     * 查询当前登陆用户相关的评论
     *
     * @param userId      用户Id
     * @param commentType 评论类型
     * @param page        当前页
     * @param pagesize    当前页大小
     * @return
     */
    @Override
    public PageResult findCommentsByUserId(Long userId, int commentType, Integer page, Integer pagesize) {
        // 注意：这里的条件userId是发布者的用户id，而Comment表中只存储了评论人id
        // 此时，如果根据发布者的id查询评论就无法实现了。
        // 所以：quanzi_comment评论表中要添加一个字段publishUserId。实体类也要加一个对应属性
        Query query = new Query(
                Criteria.where("commentType").is(commentType)
                        .and("publishUserId").is(userId)
        );
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        long count = mongoTemplate.count(query, Comment.class);
        return new PageResult(page,pagesize, (int) count,commentList);
    }

    /**
     * 保存视屏点赞数量并返回
     *
     * @param comment
     * @return
     */

    @Override
    public long saveVideoLike(Comment comment) {
        //抽离点赞功能代码
        return setUpdate(comment, Video.class);
    }

    /**
     * 删除视屏点赞数量并返回点赞数量
     *
     * @param comment
     * @return
     */
    @Override
    public long deleteVideoLike(Comment comment) {
        // 取消点赞功能
        return setDelete(comment, Video.class);
    }



    /**
     * 抽离点赞功能代码
     */
    public <T> Long setUpdate(Comment comment,Class<T> className){
        // 1.保存视屏点赞到 评论区数据库中
        mongoTemplate.save(comment);

        // 2.修改发布是视屏表，点赞数量或者是喜欢数+1
        // 2.1修改的条件：发布视屏的ID
        // 发布视屏的Id和评论区的发布动态Id进行对比
        Query query = new Query(Criteria.where("_id").is(comment.getPublishId())); //这里的publishId有迷糊性这里是VideoId

        // 2.2 修改内容 比如likeCount+1
        Update update = new Update();
        // inc：指定某个字段的值加多少
        // Col：动态选择更新的字段
        update.inc(comment.getCol(), 1);
        // updateFirst：如果存在多条满足条件的数据他就只会更新一条
        mongoTemplate.updateFirst(query, update, className);

        // 3.返回点赞数量：查询publish发布视屏表
        // 评论区的动态Id 和 videoId进行对比 并且commentType类型要和评论区的类型对比
        // 如果评论类型不是评论的话才执行下面的查询
        if (comment.getCommentType() != 2) {
            Query commentQuery = new Query(
                    Criteria.where("publishId").is(comment.getPublishId())
                            .and("commentType").is(comment.getCommentType())
            );
            // 查看点赞数评论数喜欢数
            return mongoTemplate.count(commentQuery, Comment.class);
        }

        return 1L;
    }

    /**
     * 抽离取消点赞功能代码
     */
    public <T> Long setDelete(Comment comment,Class<T> className){
        // 1.删除quanzi_comment评论表中的数据，删除条件：视屏id、commentType=1、用户id
        Query deleteQuery = new Query(Criteria.where("publishId").is(comment.getPublishId())
                .and("commentType").is(comment.getCommentType())
                .and("userId").is(comment.getUserId())
        );
        mongoTemplate.remove(deleteQuery, Comment.class);

        // 2.修改视屏表video，设置点赞数量/喜欢数量/评论数 减1
        // 查询条件
        Query query = new Query(Criteria.where("_id").is(comment.getPublishId()));
        // 修改后的数据，设置点赞数量/喜欢数量/评论数 - 1
        Update update = new Update();
        update.inc(comment.getCol(), -1);
        mongoTemplate.updateFirst(query, update, className);

        // 3.返回点赞数量/喜欢数量/评论数：根据publishId（视屏Id）、评论类型查询评论表条数
        Query countQuery = new Query(Criteria.where("publishId").is(comment.getPublishId())
                .and("commentType").is(comment.getCommentType())
        );

        return mongoTemplate.count(countQuery, Comment.class);
    }

    @Override
    public long operationLikeConnents(String id,Integer num) {
        Query query = new Query(Criteria.where("_id").is(new ObjectId(id)));
        Update update = new Update();
        update.inc("likeCount",num);
        mongoTemplate.upsert(query,update,Comment.class);
        Comment comment = mongoTemplate.findOne(query, Comment.class);
        return comment.getLikeCount();
    }

}
